import fs from "fs";
import cheerio from "cheerio";
import { Analyzer } from "./crowller";
// 定义每个课程的对象类型
interface Course {
  src: string;
}

interface JsonResult {
  time: number;
  data: Course[];
}

interface Content {
  // 键名为 number 类型，键值为 Course[]
  [propName: number]: Course[];
}
// 分析器，使用 Analyzer 接口约束自己写的分析器类
// Analyzer 接口要求需要有 analyzer: (html: string, filePath: string) => string; 这种类型的方法，否则会报错
export default class LycAnalyzer implements Analyzer {
  // 单例模式，外面不可以 new 调用
  private constructor() {}
  private static instance: LycAnalyzer;
  static getInstance() {
    if (!LycAnalyzer.instance) {
      LycAnalyzer.instance = new LycAnalyzer();
    }
    return LycAnalyzer.instance;
  }
  // 解析 html 获取 Json 信息
  private getJsonInfo(html: string) {
    // cheerio 使用方法见 https://github.com/cheeriojs/cheerio
    const $ = cheerio.load(html);
    // 获取每个区块元素
    const detailsItem = $(".UsP0xCk").find("a");
    const couresInfos: Course[] = [];
    detailsItem.map((index, element) => {
      const src = $(element).find("img").attr("src") || "";
      couresInfos.push({
        src,
      });
    });
    const result = {
      time: new Date().getTime(),
      data: couresInfos,
    };
    return result;
  }

  // 生成爬取的 json 数据文件
  private generateJsonContent(jsonInfo: JsonResult, filePath: string) {
    // 声明文件内容 Content 接口类型，并初始化为空对象
    let fileContent: Content = {};
    // 判断该文件是否存在
    if (fs.existsSync(filePath)) {
      let tempData = "";
      // 如果文件存在，则获取该文件内容
      tempData = fs.readFileSync(filePath, "utf-8");
      // 文件内容可能为空，所以要做判空处理
      if (tempData === "") tempData = "{}";
      // 文件读取后为字符串类型数据，所以要 JSON.parse 处理
      fileContent = JSON.parse(tempData);
    }
    fileContent[jsonInfo.time] = jsonInfo.data;
    return fileContent;
  }
  public analyzer(html: string, filePath: string) {
    const jsonInfo = this.getJsonInfo(html);
    const fileContent = this.generateJsonContent(jsonInfo, filePath);
    return JSON.stringify(fileContent);
  }
}
